import axios from 'axios'
import ElementUI from 'element-ui';
import { MessageBox, Message } from 'element-ui'
import { Loading } from 'element-ui'

// 声明loading变量
function startLoading() {    //使用Element loading-start 方法
  ElementUI.Loading.service({text: '加载中', background: 'rgba(0, 0, 0, 0)'})
}
function endLoading() {    //使用Element loading-close 方法
  ElementUI.Loading.service().close()
}

let needLoadingRequestCount = 0
export function showFullScreenLoading() {
  if (needLoadingRequestCount === 0) {
    startLoading()
  }
  needLoadingRequestCount++
}

export function tryHideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}

// 防抖操作的处理
let pending = [], count = 0; //声明一个数组用于存储每个请求的取消函数和axios标识
let cancelToken = axios.CancelToken;
//检查列表中是否有
let checkPending = (config) => {
  let status = false
  for (let p in pending) {
    if (pending[p].u === config.url + '&' + config.method) { //当当前请求在数组中存在时执行函数体
      status = true
    }
  }
  return status
}
let removePending = (config) => {
  console.log(config)
  for (let p in pending) {
    if (pending[p].u === config.url + '&' + config.method) { //当当前请求在数组中存在时执行函数体
      pending[p].f(); //执行取消操作
      pending.splice(p, 1);
    }
  }
}



// 创建axios实例
const instance = axios.create({
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 添加请求拦截器
instance.interceptors.request.use(config => {
  config.headers['Authorization'] = `Bearer ${localStorage.getItem('token') || null}`;
  config.headers['currCustNo'] = localStorage.getItem('currCustNo') || null;

  config.headers['requestKey'] = (count++)+Date.parse(new Date()) + Math.random() * 1000000
  config.headers['timestamp'] = Date.parse(new Date())

  // 在请求拦截中防抖处理
  // removePending(config); //在一个ajax发送前执行一下取消操作
  // config.cancelToken = new cancelToken((c) => {
  //   // 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
  //   pending.push({ u: config.url + '&' + config.method, f: c });
  // });

  //取消后进入的重复请求
  config.cancelToken = new cancelToken((c) => {
    // 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
    if(checkPending(config)){
      c()
    }else{
      pending.push({ u: config.url + '&' + config.method, f: c });
    }
  });

  // 添加loading
  showFullScreenLoading()

  return config
}, error => {
  // Do something with request error
  console.log(error)      // for debug
  Promise.reject(error)
})

// 添加响应拦截器
instance.interceptors.response.use(
  response => {
    removePending(response.config);  //在一个ajax响应成功后再执行一下取消操作，把已经完成的请求从pending中移除
    if(response.data.code >= 900){
      Message.error(response.data.msg)
    }
    //关闭loading
    tryHideFullScreenLoading()

    return response.data
  }, error => {
    const {config, code, message} = error
    //在一个ajax响应失败后再执行一下取消操作，把已经完成的请求从pending中移除
    if(config){
      removePending(error.config)
    }
    //关闭loading
    tryHideFullScreenLoading()

    if (code === 'ECONNABORTED' && message.indexOf('timeout') != -1) { // 请求超时
      Message.error(`请求超时`)
      return false
    }

    if(error?.response?.data?.code === 401){
      Message.error('超时未操作，请重新登录！');
      window.location.href = location.origin + '/ts'
      return false
    }
    if(message === undefined) return
    if (message.indexOf('503') != -1){
      ElementUI.Message.error(error.response.data.message);
    }
    if (message.indexOf('500') != -1){
      ElementUI.Message.error('500，服务器链接失败！');
    }
    if (message.indexOf('409') != -1){
      ElementUI.Message.error(error.response.data.message);
    }
    if (message.indexOf('404') != -1){
      ElementUI.Message.error('404，网络连接失败！');
    }
    if (message.indexOf('401') != -1){
      ElementUI.Message.error(error.response.data.message);
    }
    if (message.indexOf('400') != -1){
      if(error.response.data.status === 400){
        ElementUI.Message.error(error.response.data.message);
      }else{
        ElementUI.Message.error('400，参数错误！');
      }
    }

    return Promise.reject(error)
  })

export default instance
